package com.warm.demo.satoken;

import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import org.noear.solon.annotation.Controller;
import org.noear.solon.annotation.Mapping;
import org.noear.solon.validation.annotation.Valid;

/**
 * Sa-Token 权限认证示例
 *
 * @author warm
 */
@Valid
@Controller
@Mapping("/demo/kickout/")
public class KickoutController {

    /**
     * 前提：首先调用登录接口进行登录，代码在 LoginController 中有详细解释，此处不再赘述 将指定账号强制注销 ----
     * http://localhost:18080/demo/kickout/logout?userId=10001
     */
    @Mapping("logout")
    public SaResult logout(long userId) {

        // 强制注销等价于对方主动调用了注销方法，再次访问会提示：Token无效。
        StpUtil.logout(userId);

        // 返回
        return SaResult.ok();
    }

    /**
     * 将指定账号踢下线 ---- http://localhost:18080/demo/kickout/kickout?userId=10001
     *
     * @author warm
     */
    @Mapping("kickout")
    public SaResult kickout(long userId) {

        // 踢人下线不会清除Token信息，而是将其打上特定标记，再次访问会提示：Token已被踢下线。
        StpUtil.kickout(userId);

        // 返回
        return SaResult.ok();
    }

    /**
     * 根据 Token 值踢人 ----
     * http://localhost:18080/demo/kickout/kickoutByTokenValue?tokenValue=xxxx-xxxx-xxxx-xxxx已登录账号的token值
     * <p>
     * 你可以分别在强制注销和踢人下线后，再次访问一下登录校验接口，对比一下两者返回的提示信息有何不同 ---- http://localhost:18080/demo/auth/checkLogin
     */
    @Mapping("kickoutByTokenValue")
    public SaResult kickoutByTokenValue(String tokenValue) {

        StpUtil.kickoutByTokenValue(tokenValue);

        // 返回
        return SaResult.ok();
    }

}
